﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Metriks.Prezentacija.McCabe;
using Metriks.Parsiranje;

namespace Metriks.NezavisniPutevi
{
    public static class NPFactory
    {

        public static List<Putanja> pronađiSvePuteve(Cvor početni)
        {
            List<Putanja> sviPutevi = new List<Putanja>();
            Putanja prviPut = new Putanja();
            sviPutevi.Add(prviPut);
            // pokrećemo rekurziju
            prođiPut(početni, prviPut, sviPutevi);

            return sviPutevi;
        }

        public static List<Putanja> pronađiNeovisnePuteve(List<Putanja> svePutanje)
        {
            List<Putanja> neovisniPutevi = new List<Putanja>();
            neovisniPutevi.Add(svePutanje[0]);
            for (int i = 1; i < svePutanje.Count; i++)
            {
                if (svePutanje[i].sadrziNajmanjeJedanEdgeKojiNijeUPutanjama(neovisniPutevi))
                {
                    neovisniPutevi.Add(svePutanje[i]);
                }
            }
            
            return neovisniPutevi;
        }

        private static void prođiPut(Cvor trenutnaPozicija, Putanja trenutniPut, List<Putanja> sviPutevi)
        {
            if (trenutniPut.Contains(trenutnaPozicija))
            {
                Cvor neposjećenodijete = (trenutniPut.Contains(trenutnaPozicija.Cvorovi[0])) ? trenutnaPozicija.Cvorovi[1] : trenutnaPozicija.Cvorovi[0];
                prođiPut(neposjećenodijete, trenutniPut, sviPutevi);
            }
            else
            {
                trenutniPut.Add(trenutnaPozicija);

                if (trenutnaPozicija.Cvorovi.Count == 1)
                {
                    prođiPut(trenutnaPozicija.Cvorovi[0], trenutniPut, sviPutevi);
                }
                else if (trenutnaPozicija.Cvorovi.Count == 2)
                {
                    Putanja branch = new Putanja(trenutniPut);
                    prođiPut(trenutnaPozicija.Cvorovi[0], trenutniPut, sviPutevi);

                    sviPutevi.Add(branch);
                    prođiPut(trenutnaPozicija.Cvorovi[1], branch, sviPutevi);
                }
            }
        }
    }
}
